/**
 * @description 反转对象的键值对
 * @param {*} obj 
 * @param {*} fn 
 * @returns 
 */
const invertKeyValues = (obj, fn) =>
  // 使用 Object.keys() 和 Array.prototype.reduce() 反转对象的键值对并应用提供的函数。
  Object.keys(obj).reduce((acc, key) => {
    // 省略第二个参数 ,fn 以获取反转键而不对其应用函数。
    const val = fn ? fn(obj[key]) : obj[key];
    // 每个反转键对应的反转值是一个负责生成反转值的键数组。如果提供了一个函数，它将应用于每个反转键。
    acc[val] = acc[val] || [];
    acc[val].push(key);
    return acc;
  }, {});
// 例子
invertKeyValues({ a: 1, b: 2, c: 1 }); // { 1: [ 'a', 'c' ], 2: [ 'b' ] }
invertKeyValues({ a: 1, b: 2, c: 1 }, value => 'group' + value);
// { group1: [ 'a', 'c' ], group2: [ 'b' ] }
